package com.hl.card.credit.pub.service;
import java.util.List;

import com.hl.card.credit.pub.dao.AbstractDao;
import com.hl.card.credit.pub.model.AbstractModel;
import com.hl.card.credit.pub.pager.Pager;
import com.hl.card.credit.pub.utils.MD5Tools;
import com.hl.card.credit.pub.utils.PropertiesUtil;

/**
 * 
    * @ClassName: AbstractService
    * @Description: TODO(公共service)
    * @author wdf
    * @date 2018年3月25日
    *
    * @param <T>
    * @param <ID>
 */
public abstract class AbstractService<T, ID> {
	
	private static String AUTH_KEY= PropertiesUtil.getStringValue("signkey");
	private static String VERSION= PropertiesUtil.getStringValue("version");
	private static String MERCHANT_ID= PropertiesUtil.getStringValue("merchant_id");
	private static String SPARE_PRO1= PropertiesUtil.getStringValue("spare_pro1");
	private static String SPARE_PRO2= PropertiesUtil.getStringValue("spare_pro2");
	private static String TERMINAl= PropertiesUtil.getStringValue("terminal");
	public static String IP= PropertiesUtil.getStringValue("ip");
	public static String PORT= PropertiesUtil.getStringValue("port");
	
	/**
	 * 新增数据
	 * 
	 * @param entity
	 */
	public void add(T entity){
		getDao().add(entity);
	}
	/**
	 * 修改数据
	 * 
	 * @param entity
	 */
	public void update(T entity){
		getDao().update(entity);
	}

	/**
	 * 修改记录，只修改只不为空的字段
	 * 
	 * @param entity
	 */
	public void updateBySelective(T entity){
		getDao().updateBySelective(entity);
	}

	/**
	 * 根据id查询
	 * 
	 * @param id
	 * @return
	 */
	public T queryById(ID id) {
		return getDao().queryById(id);
	}
	
	/**
	 * 根据多条件查询
	 * 
	 * @param model
	 * @return
	 */
	public T queryDetail(AbstractModel model) {
		return getDao().queryDetail(model);
	}


	/**
	 * 批量删除
	 * 
	 * @param ids
	 */
	public void delete(ID[] ids){
		for(ID id : ids){
			getDao().deleteById(id);
		}
	}
	public void deleteById(ID id){
			getDao().deleteById(id);
	}

	/**
	 * 分页查询
	 * 
	 * @param id
	 * @return
	 */
	public List<T> queryByPage(AbstractModel model) {
		if (model.getPager()==null) {
			model.setPager(new Pager());
		}
		int rowCount = getDao().queryByPageCount(model);
		model.getPager().setRowCount(rowCount);
		return getDao().queryByPage(model);
	}
	
	/**
	 * 查询统计
	 * 
	 * @param id
	 * @return
	 */
	public int queryByPageCount(AbstractModel model) {
		return getDao().queryByPageCount(model);
	}
	
	protected void setPagerCount(AbstractModel record) {
		int rowCount = getDao().queryByPageCount(record);
		record.getPager().setRowCount(rowCount);
	}
	
	/**
	 * 
	    * @Title: queryAll
	    * @Description: TODO(根据条件查询所有)
	    * @param @param model
	    * @param @return    参数
	    * @return List<T>    返回类型
	    * @throws
	 */
	public List<T> queryAll(AbstractModel model){
		return getDao().queryAll(model);
	}
	
	/**
	 * 抽取公用的参数集合
	 * @param url
	 * @param type
	 * @param timestamp
	 * @return
	 */
	public String getAuth(String type,String timestamp)
	{
		
		if(SPARE_PRO1!=null&&!"".equals(SPARE_PRO1))
		{
			SPARE_PRO1="&spare_pro1="+SPARE_PRO1;
		}else
		{
			SPARE_PRO1="";
		}
		if(SPARE_PRO2!=null&&!"".equals(SPARE_PRO2))
		{
			SPARE_PRO2="&spare_pro2="+SPARE_PRO2;
		}else
		{
			SPARE_PRO2="";
		}
		return TERMINAl+MERCHANT_ID+timestamp+type+VERSION+SPARE_PRO1+SPARE_PRO2;
	}
	/**
	 * 获取公匙
	 * @param auth
	 * @return
	 */
	public String getHmac(String auth)
	{
		return MD5Tools.md5(auth+AUTH_KEY);
	}
	public String getParams(String type,String timestamp)
	{
		return "terminal="+TERMINAl+"&merchant_id="+MERCHANT_ID+"&timestamp="+timestamp+"&type="+type+"&version="+VERSION+SPARE_PRO1+SPARE_PRO2;
	}

	/**
	 * 子类需要实现的方法。
	 * 
	 * @return
	 */
	protected abstract AbstractDao<T, ID> getDao();
}
